bleh
[mqlkit.git] / indicators / COG THV.mq4
blob5e14d1c1930404200bb2a87674ccb13687e4421a
1 //+------------------------------------------------------------------+\r
2 //|                                            Center of Gravity.mq4 |\r
3 //| Original Code from NG3110@latchess.com                           |                                    \r
4 //| Modified for THV system by Cobraforex, www.cobraforex.com        |\r
5 //+------------------------------------------------------------------+\r
6 #property  copyright "ANG3110@latchess.com"\r
7 //---------ang_PR (Din)--------------------\r
8 #property indicator_chart_window\r
9 #property indicator_buffers 5\r
10 #property indicator_color1 Black\r
11 #property indicator_color2 FireBrick\r
12 #property indicator_color3 DarkGreen\r
13 #property indicator_color4 Black\r
14 #property indicator_color5 Black\r
15 //-----------------------------------\r
16 extern int bars_back = 120;\r
17 extern int m = 4;\r
18 extern int i = 0;\r
19 extern double kstd = 2.0;\r
20 extern int sName = 720;\r
21 //-----------------------\r
22 double fx[], sqh[], sql[], stdh[], stdl[];\r
23 double ai[10,10], b[10], x[10], sx[20];\r
24 double sum;\r
25 int    ip, p, n, f;\r
26 double qq, mm, tt;\r
27 int    ii, jj, kk, ll, nn;\r
28 double sq, std;\r
29 //*******************************************\r
30 int init()\r
31 {\r
32    IndicatorShortName("COG THV");\r
33    SetIndexStyle(0, DRAW_LINE);\r
34    SetIndexBuffer(0, fx);\r
35    SetIndexBuffer(1, sqh);\r
36    SetIndexBuffer(2, sql);\r
37    SetIndexBuffer(3, stdh);\r
38    SetIndexBuffer(4, stdl);\r
39    p = MathRound(bars_back);\r
40    nn = m + 1;\r
41    ObjectCreate("pr" + sName, 22, 0, Time[p], fx[p]);\r
42    ObjectSet("pr" + sName, 14, 159);\r
43    return(0);\r
44 }\r
45 //----------------------------------------------------------\r
46 int deinit()\r
47 {\r
48    ObjectDelete("pr" + sName);\r
49 }\r
50 //**********************************************************************************************\r
51 int start()\r
52 {\r
53    int mi;\r
54 //-------------------------------------------------------------------------------------------\r
55    ip = iBarShift(Symbol(), Period(), ObjectGet("pr" + sName, OBJPROP_TIME1));\r
56    p = bars_back; \r
57    sx[1] = p + 1;\r
58    SetIndexDrawBegin(0, Bars - p - 1);\r
59    SetIndexDrawBegin(1, Bars - p - 1);\r
60    SetIndexDrawBegin(2, Bars - p - 1);\r
61    SetIndexDrawBegin(3, Bars - p - 1);\r
62    SetIndexDrawBegin(4, Bars - p - 1); \r
63 //----------------------sx-------------------------------------------------------------------\r
64    for(mi = 1; mi <= nn * 2 - 2; mi++)\r
65    {\r
66       sum = 0;\r
67       for(n = i; n <= i + p; n++)\r
68       {\r
69          sum += MathPow(n, mi);\r
70       }\r
71       sx[mi + 1] = sum;\r
72    }  \r
73 //----------------------syx-----------\r
74    for(mi = 1; mi <= nn; mi++)\r
75    {\r
76       sum = 0.00000;\r
77       for(n = i; n <= i + p; n++)\r
78       {\r
79          if(mi == 1)\r
80             sum += Close[n];\r
81          else\r
82             sum += Close[n] * MathPow(n, mi - 1);\r
83       }\r
84       b[mi] = sum;\r
85    } \r
86 //===============Matrix=======================================================================================================\r
87    for(jj = 1; jj <= nn; jj++)\r
88    {\r
89       for(ii = 1; ii <= nn; ii++)\r
90       {\r
91          kk = ii + jj - 1;\r
92          ai[ii, jj] = sx[kk];\r
93       }\r
94    }  \r
95 //===============Gauss========================================================================================================\r
96    for(kk = 1; kk <= nn - 1; kk++)\r
97    {\r
98       ll = 0; mm = 0;\r
99       for(ii = kk; ii <= nn; ii++)\r
100       {\r
101          if(MathAbs(ai[ii, kk]) > mm)\r
102          {\r
103             mm = MathAbs(ai[ii, kk]);\r
104             ll = ii;\r
105          }\r
106       }\r
107       if(ll == 0)\r
108          return(0);   \r
110       if(ll != kk)\r
111       {\r
112          for(jj = 1; jj <= nn; jj++)\r
113          {\r
114             tt = ai[kk, jj];\r
115             ai[kk, jj] = ai[ll, jj];\r
116             ai[ll, jj] = tt;\r
117          }\r
118          tt = b[kk]; b[kk] = b[ll]; b[ll] = tt;\r
119       }  \r
120       for(ii = kk + 1; ii <= nn; ii++)\r
121       {\r
122          qq = ai[ii, kk] / ai[kk, kk];\r
123          for(jj = 1; jj <= nn; jj++)\r
124          {\r
125             if(jj == kk)\r
126                ai[ii, jj] = 0;\r
127             else\r
128                ai[ii, jj] = ai[ii, jj] - qq * ai[kk, jj];\r
129          }\r
130          b[ii] = b[ii] - qq * b[kk];\r
131       }\r
132    }  \r
133    x[nn] = b[nn] / ai[nn, nn];\r
134    for(ii = nn - 1; ii >= 1; ii--)\r
135    {\r
136       tt = 0;\r
137       for(jj = 1; jj <= nn - ii; jj++)\r
138       {\r
139          tt = tt + ai[ii, ii + jj] * x[ii + jj];\r
140          x[ii] = (1 / ai[ii, ii]) * (b[ii] - tt);\r
141       }\r
142    } \r
143 //===========================================================================================================================\r
144    for(n = i; n <= i + p; n++)\r
145    {\r
146       sum = 0;\r
147       for(kk = 1; kk <= m; kk++)\r
148       {\r
149          sum += x[kk + 1] * MathPow(n, kk);\r
150       }\r
151       fx[n] = x[1] + sum;\r
152    } \r
153 //-----------------------------------Std-----------------------------------------------------------------------------------\r
154    sq = 0.0;\r
155    for(n = i; n <= i + p; n++)\r
156    {\r
157       sq += MathPow(Close[n] - fx[n], 2);\r
158    }\r
159    sq = MathSqrt(sq / (p + 1)) * kstd;\r
160    std = iStdDev(NULL, 0, p, MODE_SMA, 0, PRICE_CLOSE, i) * kstd;\r
161    for(n = i; n <= i + p; n++)\r
162    {\r
163       sqh[n] = fx[n] + sq;\r
164       sql[n] = fx[n] - sq;\r
165       stdh[n] = fx[n] + std;\r
166       stdl[n] = fx[n] - std;\r
167    } \r
168 //-------------------------------------------------------------------------------\r
169    ObjectMove("pr" + sName, 0, Time[p], fx[p]);\r
170 //----------------------------------------------------------------------------------------------------------------------------\r
171    return(0);\r
173 //==========================================================================================================================   \r